package com.lvy.hczn.front.business.service;

import com.baomidou.mybatisplus.extension.service.IService;
import com.lvy.hczn.front.system.domain.business.GoodsBox;
import com.lvy.hczn.front.system.domain.business.GoodsBoxDetail;
import com.lvy.hczn.front.business.dto.SortFrmLoseDto;
import org.springframework.ui.ModelMap;

import javax.servlet.http.HttpServletRequest;
import java.util.List;

public interface GoodsBoxDetailService extends IService<GoodsBoxDetail> {

    /**
     * 根据原料查询最先入库的原料
     *
     * @param spuId
     * @return
     * @author yw
     * @date 2022-04-17 16:43:22
     */
    List<GoodsBoxDetail> selectBySpuId(String spuId) throws Exception;

    /**
     * spuId list查询
     *
     * @param list
     * @return
     * @author yw
     * @date 2022-04-17 16:43:22
     */
    List<GoodsBoxDetail> selectBySpuIdList(List<String> list, String clientId) throws Exception;

    /**
     * 同一供应商，同一批次的同一商品合并，切合并箱子内不能包含其他供应商的相同品类
     * （如：合并A供应商的苹果，且是合并A供应商的同一批次的苹果，且要合并入库
     * 的箱子中，不能含有其他供应商的苹果这个品类），且是操作人员触发一次，合并一箱
     *
     * @return
     * @author yw
     * @date 2022-05-10 13:51:12
     */
    List<Object> selectMergeBox(GoodsBox goodsBox, String clientId, boolean isDownload) throws Exception;

    /**
     * 物理删除
     *
     * @param boxCode
     * @return
     * @author yw
     * @date 2022-03-20 11:26:52
     */
    int delPhysicalByBoxCode(String boxCode) throws Exception;

    /**
     * 查询货箱详情列表
     *
     * @param goodsBoxDetail
     * @return
     * @author yw
     * @date 2022-03-20 11:26:52
     */
    List<GoodsBoxDetail> selectBoxDetailByBoxCode(GoodsBoxDetail goodsBoxDetail) throws Exception;

    /**
     * 原料报损
     *
     * @param sortFrmLoseDto
     * @return
     * @author yw
     * @date 2022-07-28 15:08:36
     */
    GoodsBoxDetail updateFrmLoseById(SortFrmLoseDto sortFrmLoseDto) throws Exception;

    /**
     * 根据指令状态和流程类型查询货箱信息
     *
     * @param type
     * @param processType
     * @return
     */
    List<GoodsBoxDetail> selectByUpOrDownPolicyType(String type, Integer processType) throws Exception;

    /**
     * 根据出库单查询货箱详情列表
     *
     * @param outBoundOrderCode
     * @return
     */
    List<GoodsBoxDetail> selectTransferSortDoneByOutBoundOrderCode(String outBoundOrderCode);

    /**
     * 临期报损，离开缓存位后处理
     *
     * @param goodsBoxDetailInfo
     * @return
     */
    void frmLossLeaveBuffer(GoodsBoxDetail goodsBoxDetailInfo);

    /**
     * 指定仓库编号商品ID查询列表
     *
     * @param warehouseNumber
     * @param spuIdList
     * @return
     * @author yw
     * @date 2023-11-03 10:33:17
     */
    List<GoodsBoxDetail> selectByWareHouseNumberAndSpuIdList(String warehouseNumber, List<String> spuIdList);

    /**
     * 查询货箱详情
     *
     * @param id 货箱详情主键
     * @return 货箱详情
     */
    GoodsBoxDetail selectGoodsBoxDetailById(String id);

    /**
     * 查询货箱详情列表
     *
     * @param goodsBoxDetail 货箱详情
     * @return 货箱详情集合
     */
    List<GoodsBoxDetail> selectGoodsBoxDetailList(GoodsBoxDetail goodsBoxDetail);

    /**
     * 新增货箱详情
     *
     * @param goodsBoxDetail 货箱详情
     * @return 结果
     */
    int insertGoodsBoxDetail(GoodsBoxDetail goodsBoxDetail);

    /**
     * 修改货箱详情
     *
     * @param goodsBoxDetail 货箱详情
     * @return 结果
     */
    int updateGoodsBoxDetail(GoodsBoxDetail goodsBoxDetail);

    /**
     * 批量删除货箱详情
     *
     * @param ids 需要删除的货箱详情主键集合
     * @return 结果
     */
    int deleteGoodsBoxDetailByIds(String ids);

    /**
     * 删除货箱详情信息
     *
     * @param id 货箱详情主键
     * @return 结果
     */
    int deleteGoodsBoxDetailById(String id);

    ModelMap bigProductEntryOpen(HttpServletRequest request, String ids, ModelMap mmap);

    GoodsBox bigProductEntry(GoodsBox goodsBox);
}